<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>知识总结（四）HTTP相关 | lty的博客</title>
    <meta name="generator" content="VuePress 1.8.2">
    <link rel="icon" href="/blog/favicon.ico">
    <meta name="description" content="山重水复疑无路，柳暗花明又一村">
    <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
    
    <link rel="preload" href="/blog/assets/css/0.styles.ca934e57.css" as="style"><link rel="preload" href="/blog/assets/js/app.2c497286.js" as="script"><link rel="preload" href="/blog/assets/js/3.1e41fb2d.js" as="script"><link rel="preload" href="/blog/assets/js/1.a1bf8e1e.js" as="script"><link rel="preload" href="/blog/assets/js/34.30160844.js" as="script"><link rel="prefetch" href="/blog/assets/js/10.595db545.js"><link rel="prefetch" href="/blog/assets/js/11.a57c5d33.js"><link rel="prefetch" href="/blog/assets/js/12.bbd60eab.js"><link rel="prefetch" href="/blog/assets/js/13.0a322639.js"><link rel="prefetch" href="/blog/assets/js/14.45182424.js"><link rel="prefetch" href="/blog/assets/js/15.8bfecd82.js"><link rel="prefetch" href="/blog/assets/js/16.f295f32f.js"><link rel="prefetch" href="/blog/assets/js/17.de5dabe7.js"><link rel="prefetch" href="/blog/assets/js/18.dbcf4366.js"><link rel="prefetch" href="/blog/assets/js/19.dc4ed650.js"><link rel="prefetch" href="/blog/assets/js/20.9000ffe3.js"><link rel="prefetch" href="/blog/assets/js/21.50c08d3d.js"><link rel="prefetch" href="/blog/assets/js/22.849f004a.js"><link rel="prefetch" href="/blog/assets/js/23.4c25a240.js"><link rel="prefetch" href="/blog/assets/js/24.a2930e6d.js"><link rel="prefetch" href="/blog/assets/js/25.20efd6e6.js"><link rel="prefetch" href="/blog/assets/js/26.1881faa9.js"><link rel="prefetch" href="/blog/assets/js/27.18bc2dfe.js"><link rel="prefetch" href="/blog/assets/js/28.903117fb.js"><link rel="prefetch" href="/blog/assets/js/29.e1d01502.js"><link rel="prefetch" href="/blog/assets/js/30.27049c11.js"><link rel="prefetch" href="/blog/assets/js/31.455cb7a6.js"><link rel="prefetch" href="/blog/assets/js/32.72aa7ec8.js"><link rel="prefetch" href="/blog/assets/js/33.6362e43e.js"><link rel="prefetch" href="/blog/assets/js/35.991fefa1.js"><link rel="prefetch" href="/blog/assets/js/36.3350110b.js"><link rel="prefetch" href="/blog/assets/js/37.38b67684.js"><link rel="prefetch" href="/blog/assets/js/38.33876f62.js"><link rel="prefetch" href="/blog/assets/js/4.870f2524.js"><link rel="prefetch" href="/blog/assets/js/5.516ed845.js"><link rel="prefetch" href="/blog/assets/js/6.710883e3.js"><link rel="prefetch" href="/blog/assets/js/7.3579268a.js"><link rel="prefetch" href="/blog/assets/js/8.1e580575.js"><link rel="prefetch" href="/blog/assets/js/9.08e245bf.js">
    <link rel="stylesheet" href="/blog/assets/css/0.styles.ca934e57.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container no-sidebar" data-v-1aefc0b4><div data-v-1aefc0b4><div id="loader-wrapper" class="loading-wrapper" data-v-d48f4d20 data-v-1aefc0b4 data-v-1aefc0b4><div class="loader-main" data-v-d48f4d20><div data-v-d48f4d20></div><div data-v-d48f4d20></div><div data-v-d48f4d20></div><div data-v-d48f4d20></div></div> <!----> <!----></div> <div class="password-shadow password-wrapper-out" style="display:none;" data-v-25ba6db2 data-v-1aefc0b4 data-v-1aefc0b4><h3 class="title" data-v-25ba6db2 data-v-25ba6db2>lty的博客</h3> <p class="description" data-v-25ba6db2 data-v-25ba6db2>山重水复疑无路，柳暗花明又一村</p> <label id="box" class="inputBox" data-v-25ba6db2 data-v-25ba6db2><input type="password" value="" data-v-25ba6db2> <span data-v-25ba6db2>Konck! Knock!</span> <button data-v-25ba6db2>OK</button></label> <div class="footer" data-v-25ba6db2 data-v-25ba6db2><span data-v-25ba6db2><i class="iconfont reco-theme" data-v-25ba6db2></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-25ba6db2>vuePress-theme-reco</a></span> <span data-v-25ba6db2><i class="iconfont reco-copyright" data-v-25ba6db2></i> <a data-v-25ba6db2><span data-v-25ba6db2>lty</span>
            
          <!---->
          2022
        </a></span></div></div> <div class="hide" data-v-1aefc0b4><header class="navbar" data-v-1aefc0b4><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/blog/" class="home-link router-link-active"><img src="/blog/logo.png" alt="lty的博客" class="logo"> <span class="site-name">lty的博客</span></a> <div class="links"><div class="color-picker"><a class="color-button"><i class="iconfont reco-color"></i></a> <div class="color-picker-menu" style="display:none;"><div class="mode-options"><h4 class="title">Choose mode</h4> <ul class="color-mode-options"><li class="dark">dark</li><li class="auto active">auto</li><li class="light">light</li></ul></div></div></div> <div class="search-box"><i class="iconfont reco-search"></i> <input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/blog/" class="nav-link"><i class="iconfont reco-home"></i>
  主页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-category"></i>
      分类
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/categories/JavaScript/" class="nav-link"><i class="undefined"></i>
  JavaScript
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/投资/" class="nav-link"><i class="undefined"></i>
  投资
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/计算机网络/" class="nav-link"><i class="undefined"></i>
  计算机网络
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/前端相关/" class="nav-link"><i class="undefined"></i>
  前端相关
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/知识总结/" class="nav-link"><i class="undefined"></i>
  知识总结
</a></li></ul></div></div><div class="nav-item"><a href="/blog/tag/" class="nav-link"><i class="iconfont reco-tag"></i>
  标签
</a></div><div class="nav-item"><a href="/blog/timeline/" class="nav-link"><i class="iconfont reco-date"></i>
  时间线
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-message"></i>
      关于
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://gitee.com/ekzodia_lty" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-mayun"></i>
  Gitee
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask" data-v-1aefc0b4></div> <aside class="sidebar" data-v-1aefc0b4><div class="personal-info-wrapper" data-v-39576ba9 data-v-1aefc0b4><img src="/blog/avatar.jpg" alt="author-avatar" class="personal-img" data-v-39576ba9> <h3 class="name" data-v-39576ba9>
    lty
  </h3> <div class="num" data-v-39576ba9><div data-v-39576ba9><h3 data-v-39576ba9>27</h3> <h6 data-v-39576ba9>Articles</h6></div> <div data-v-39576ba9><h3 data-v-39576ba9>18</h3> <h6 data-v-39576ba9>Tags</h6></div></div> <ul class="social-links" data-v-39576ba9></ul> <hr data-v-39576ba9></div> <nav class="nav-links"><div class="nav-item"><a href="/blog/" class="nav-link"><i class="iconfont reco-home"></i>
  主页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-category"></i>
      分类
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/categories/JavaScript/" class="nav-link"><i class="undefined"></i>
  JavaScript
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/投资/" class="nav-link"><i class="undefined"></i>
  投资
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/计算机网络/" class="nav-link"><i class="undefined"></i>
  计算机网络
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/前端相关/" class="nav-link"><i class="undefined"></i>
  前端相关
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/知识总结/" class="nav-link"><i class="undefined"></i>
  知识总结
</a></li></ul></div></div><div class="nav-item"><a href="/blog/tag/" class="nav-link"><i class="iconfont reco-tag"></i>
  标签
</a></div><div class="nav-item"><a href="/blog/timeline/" class="nav-link"><i class="iconfont reco-date"></i>
  时间线
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-message"></i>
      关于
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://gitee.com/ekzodia_lty" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-mayun"></i>
  Gitee
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div> <!----></nav> <!----> </aside> <div class="password-shadow password-wrapper-in" style="display:none;" data-v-25ba6db2 data-v-1aefc0b4><h3 class="title" data-v-25ba6db2 data-v-25ba6db2>知识总结（四）HTTP相关</h3> <!----> <label id="box" class="inputBox" data-v-25ba6db2 data-v-25ba6db2><input type="password" value="" data-v-25ba6db2> <span data-v-25ba6db2>Konck! Knock!</span> <button data-v-25ba6db2>OK</button></label> <div class="footer" data-v-25ba6db2 data-v-25ba6db2><span data-v-25ba6db2><i class="iconfont reco-theme" data-v-25ba6db2></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-25ba6db2>vuePress-theme-reco</a></span> <span data-v-25ba6db2><i class="iconfont reco-copyright" data-v-25ba6db2></i> <a data-v-25ba6db2><span data-v-25ba6db2>lty</span>
            
          <!---->
          2022
        </a></span></div></div> <div data-v-1aefc0b4><main class="page"><section><div class="page-title"><h1 class="title">知识总结（四）HTTP相关</h1> <div data-v-f875f3fc><i class="iconfont reco-account" data-v-f875f3fc><span data-v-f875f3fc>lty</span></i> <i class="iconfont reco-date" data-v-f875f3fc><span data-v-f875f3fc>2/13/2022</span></i> <i class="iconfont reco-eye" data-v-f875f3fc><span id="/blog/blogs/Summary/4.http.html" data-flag-title="Your Article Title" class="leancloud-visitors" data-v-f875f3fc><a class="leancloud-visitors-count" style="font-size:.9rem;font-weight:normal;color:#999;"></a></span></i> <i class="tags iconfont reco-tag" data-v-f875f3fc><span class="tag-item" data-v-f875f3fc>HTTP</span></i></div></div> <div class="theme-reco-content content__default"><blockquote><p>参考文章：</p> <p><a href="https://mp.weixin.qq.com/s/BMAj0tKXd7E00PHYK_68JA" target="_blank" rel="noopener noreferrer">(建议收藏)前端面试必问的十六条HTTP网络知识体系 (qq.com)<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p> <p><a href="https://ekzodia_lty.gitee.io/blog/blogs/Network/httptj.html#tcp-ip%E5%8D%8F%E8%AE%AE%E6%97%8F%E6%8C%89%E5%B1%82%E6%AC%A1%E5%88%86%E4%B8%BA%E4%BB%A5%E4%B8%8B%E5%9B%9B%E5%B1%82" target="_blank" rel="noopener noreferrer">《图解HTTP》读书笔记 (gitee.io)<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p> <p><a href="https://ekzodia_lty.gitee.io/blog/blogs/About/1.html#%E5%89%8D%E8%A8%80" target="_blank" rel="noopener noreferrer">（转）前端缓存知识 (gitee.io)<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p></blockquote> <h2 id="osi七层模型"><a href="#osi七层模型" class="header-anchor">#</a> OSI七层模型</h2> <ul><li>应用层（HTTP、SMTP、FTP、DNS）</li> <li>表示层</li> <li>会话层</li> <li>运输层（TCP、UDP）</li> <li>网络层（IP层）</li> <li>链路层</li> <li>物理层</li></ul> <h2 id="tcp-ip模型"><a href="#tcp-ip模型" class="header-anchor">#</a> TCP/IP模型</h2> <ul><li>应用层：FTP文件传输协议、HTTP协议、DNS域名系统</li> <li>传输层：TCP、UDP</li> <li>网络层：IP协议（负责传输）</li> <li>数据链路层：用来处理连接网络的硬件部分</li></ul> <h2 id="udp-与-tcp-的区别是什么"><a href="#udp-与-tcp-的区别是什么" class="header-anchor">#</a> UDP 与 TCP 的区别是什么？</h2> <h3 id="udp"><a href="#udp" class="header-anchor">#</a> UDP</h3> <p>UDP 协议只是数据报文的搬运工，不保证有序且不丢失的传递到对端，并且UDP 协议也没有任何控制流量的算法，总的来说 UDP 相较于 TCP 更加的轻便。</p> <h4 id="udp的特点"><a href="#udp的特点" class="header-anchor">#</a> UDP的特点：</h4> <ul><li>面向无连接</li> <li>不可靠性</li> <li>高效（头部开销小，只有八个字节）</li> <li>传输方式（一对一，一对多，多对多都支持）</li></ul> <h4 id="udp的使用场景"><a href="#udp的使用场景" class="header-anchor">#</a> UDP的使用场景：</h4> <ul><li>直播</li> <li>实时性要求很高的游戏</li></ul> <h3 id="tcp"><a href="#tcp" class="header-anchor">#</a> TCP</h3> <h4 id="tcp头部标识符"><a href="#tcp头部标识符" class="header-anchor">#</a> TCP头部标识符</h4> <ul><li>URG=1：该字段为一表示本数据报的数据部分包含紧急信息，是一个高优先级数据报文，此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面，紧急指针标明了紧急数据的尾部。</li> <li>ACK=1：该字段为一表示确认号字段有效。此外，TCP 还规定在连接建立后传送的所有报文段都必须把 ACK 置为一。</li> <li>SYN=1：当SYN=1，ACK=0时，表示当前报文段是一个连接请求报文。当SYN=1，ACK=1时，表示当前报文段是一个同意建立连接的应答报文。</li> <li>FIN=1：该字段为一表示此报文段是一个释放连接的请求报文。</li></ul> <h2 id="三次握手"><a href="#三次握手" class="header-anchor">#</a> 三次握手</h2> <p>最开始客户端处于 <code>CLOSED</code>状态，服务器处于 <code>LISTEN</code>状态(随时等待被撩)。</p> <ul><li><p><strong>第一握手：</strong> 客户端首先发送一段 <code>SYN</code>报文，包含生成的序列号，这个时候客户端处于 <code>发送后等待</code>状态。</p></li> <li><p><strong>第二次握手：</strong> 服务端收到客户端发送的 <code>SYN</code>报文后，将序列号 <code>+1</code>后作为 <code>ACk</code>应答码返回给客户端，一并返回的包括服务端生成的序列号。这个时候服务端就处于 <code>半连接</code>状态，服务端也能确认了客户端的 <code>发送能力正常</code>，自己的 <code>发送能力</code>、<code>接收能力</code>正常，唯独不知道客户端的接收能力是否正常。所以说二次握手并不能满足实际需要。</p></li> <li><p><strong>第三次握手：</strong> 客户端接收到服务端返回的 <code>ACK</code>以及序列号后，将序列号 <code>+1</code>作为 <code>ACK</code>码再返回给服务端。这个时候客户端就能确认自己的 <code>发送</code>、<code>接收</code>能力正常，服务端的 <code>发送</code>、<code>接收</code>能力也正常。服务端接收到 <code>ACK</code>码之后，将之前的半连接转换成全连接，也就完成了握手连接。</p> <p>所以，三次握手正好确认双方的 <code>发送</code>、<code>接收</code>能力正常了，再多一次可以嘛？其实也可以的，只是无用，白白浪费了而已，所以三次足以。</p> <p>**备注：**三次握手过程中，前两次不可携带数据，第三次握手可以携带数据。因为前两次若能携带数据的话，攻击者会利用这个缺陷发送大量数据给服务端，而故意忽略第三次，从而导致服务端产生大量 <code>半连接</code>状态会话，同时服务器要耗费更多内存去处理数据，<code>半连接</code>多了，达到一定数量后影响 <code>正常连接</code>，导致丢包等事件发生，故而产生 <code>SYN</code>攻击。第三次握手是可以携带数据的，因为第三次握手的时候，已经建立了正常连接，互相信任了，这个时候处理数据也无可厚非。</p></li></ul> <h2 id="四次挥手"><a href="#四次挥手" class="header-anchor">#</a> 四次挥手</h2> <ul><li><strong>第一次挥手：</strong> 客户端要断开连接，向服务端发送 <code>FIN</code>报文，其中会包含客户端生成的序列号。这个时候客户端处于 <code>FIN-WAIT-1</code>状态，也就是说这个时候客户端处于只能接收、不会再发送的状态。</li> <li><strong>第二次挥手：</strong> 服务端回应客户端状态。这个时候服务端也不在接收来自客户端的数据，处于 <code>CLOSED-WAIT</code>状态，但是还有未处理完的数据要继续处理。客户端收到服务端反馈后变成 <code>FIN-WAIT2</code>状态。</li> <li><strong>第三次挥手：</strong> 服务端处理完最后发送的数据后，再想客户端发送 <code>FIN</code>，自己进入 <code>LAST-ACK</code>状态。</li> <li><strong>第四次挥手：</strong> 客户端收到服务端发来的 <code>FIN</code>后，自己变成了 <code>TIME-WAIT</code>状态，然后发送 <code>ACK</code> 给服务端。
**备注：**第三次挥手后，服务端会间隔一定时间发送报文给客户端，确保客户端收到报文。只有当收到客户端第四次挥手返回的信息，才不会发送。所以第四次挥手后，客户端需要等待足够长的时间(<code>2MSL</code>)，也就是报文最大生存时间，来确保没有再收到服务端返回的信息，只要没收到信息，客户端就能确保服务端收到第四次握手信息了，服务端也确保第三次握手也是成功的了。</li></ul> <h2 id="http缓存"><a href="#http缓存" class="header-anchor">#</a> http缓存</h2> <ul><li>强缓存</li> <li>协商缓存</li> <li>缓存位置</li></ul> <h3 id="_1-什么是强缓存、协商缓存"><a href="#_1-什么是强缓存、协商缓存" class="header-anchor">#</a> 1.什么是强缓存、协商缓存</h3> <p>关于什么时候命中 <code>强缓存</code>，什么时候命中 <code>协商缓存</code>，主要依赖于 <code>http</code>返回头信息里的 <code>Cache-Control</code>返回字段进行控制。</p> <p>**什么情况下命中强缓存？**以常见的 <code>max-age</code>为例：若 <code>max-age=5356800</code>，则意思是说浏览器在首次请求这个文件的时候，可以在本地磁盘中保存这个文件 <code>5356800秒</code>，从首次加载时间开始以后的这些时间内，若再次请求这个文件，浏览器可以不发起 <code>http</code>请求，而直接使用缓存中的内容即可，这样不仅节省了服务器负担，也提升网站用户体验。
**什么情况下命中协商缓存？**仍然以常见的 <code>max-age</code>为例：若 <code>max-age=5356800</code>，距离第一次请求文件已经过去了 <code>5356800秒</code>，当用户再次需要这个资源的时候，浏览器就会拿之前这个文件返回的 <code>Etag</code>以及 <code>Last-Modified</code>，分别命名为 <code>If-None-Match</code>和 <code>If-Modified-Since</code>作为请求参数传给服务端，服务端与现有文件进行匹配，若文件已更新，则返回 <code>200</code>状态码，同时返回最新文件给客户端。若文件未更新，则返回 <code>304</code>状态码，告诉客户端缓存有效，可以继续使用。</p> <h3 id="_2-缓存位置"><a href="#_2-缓存位置" class="header-anchor">#</a> 2.缓存位置</h3> <p>关于文件缓存位置，可通过 <code>Chrome</code>开发面板中，<code>Network</code>栏目下每个文件后面有一个 <code>Size</code>属性查看</p> <ul><li>首次请求，会显示当前文件大小，例如 <code>xxkB</code>。</li> <li>在网页未关闭之前，再次请求，会从内存中取出文件，显示 <code>(memory cache)</code>。</li> <li>关闭网页再次请求的时候，若命中强缓存，会从磁盘中取出，显示 <code>(disk cache)</code>。</li></ul> <h3 id="_3-cache-control有哪些字段"><a href="#_3-cache-control有哪些字段" class="header-anchor">#</a> 3.Cache-Control有哪些字段</h3> <p><strong>public</strong> 公共的。表示任何人都可以缓存，包括浏览器、代理服务器等。
<strong>private</strong> 私有的。表示只允许单个用户缓存，不能作为共享缓存。
<strong>no-cache</strong> 本地可以缓存，但每次都需要与服务端协商，即每次都命中协商缓存。
<strong>no-store</strong> 不适用任何缓存。
<strong>max-age=xxx</strong> 设置缓存最大周期(单位秒)，超过这个相对时间被认为是过期，需要与服务端协商是否还可继续使用。与 <code>Expires</code>不同，因为它是绝对时间，目前基本上已被废弃，因为若服务器时间与客户端时间相差较大的情况下，会产生一些异常问题。
<strong>s-maxage=xxx</strong> 设置代理服务器缓存文件过期相对时间，客户端会忽略它。
<strong>must-revalidate</strong> 一旦资源过期(比如超过max-age)，在成功向原始服务器验证之前，缓存不能用该资源响应后续请求。
<strong>no-transform</strong> 不得对资源进行转换或转变。
<strong>only-if-cached</strong> 表明客户端只接受已缓存的响应，并且不要向原始服务器检查是否有更新的拷贝。</p> <h2 id="http状态码"><a href="#http状态码" class="header-anchor">#</a> http状态码</h2> <h3 id="状态码的类别"><a href="#状态码的类别" class="header-anchor">#</a> 状态码的类别</h3> <p><img src="https://gitee.com/ekzodia_lty/blog-image/raw/master/img/image-20220115182031227.png" alt="img"></p> <h3 id="_2xx-成功"><a href="#_2xx-成功" class="header-anchor">#</a> 2XX 成功</h3> <p>200：客户端发来的请求在服务端被正常处理。</p> <p>204：表示该服务接收的请求已经成功处理，但在返回的响应报文中不含实体的主体部分。一般只在需要从客户端往服务端发送信息，对客户端不需要发送新信息内容的情况下使用。</p> <p>206：表示客户端进行了范围请求，而服务器成功执行了这部分GET请求。</p> <h3 id="_3xx-重定向"><a href="#_3xx-重定向" class="header-anchor">#</a> 3XX 重定向</h3> <blockquote><p>3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。</p></blockquote> <p>301：永久性重定向。该状态码表示请求的资源已经被分配了新的URI，以后应使用资源现在所指的URI。</p> <p>302：临时重定向。该状态码表示请求的资源已经被分配给了新的URI，希望用户本次能够使用新的URI访问。</p> <p>303：该状态码表示由于请求对应的资源存在着另一个URI，应使用GET方法定向获取请求的资源。（明确使用GET方法获得资源，与302有所区别）</p> <p>304：表示客户端发送附带条件的请求时，服务器端允许请求访问资源，但未满足条件的情况。304状态码返回时，不包含任何响应的主体部分。304虽然被划分在3XX当中，但是和重定向没有关系。</p> <p>307：临时重定向。该状态码与302有着相同的意义。</p> <h3 id="_4xx-客户端错误"><a href="#_4xx-客户端错误" class="header-anchor">#</a> 4XX 客户端错误</h3> <p>400：表示请求报文中存在语法错误。当错误发生时，需修改请求的内容后再次发送请求。另外，浏览器回向200 OK一样对待该状态码。</p> <p>401：该状态码发送的请求需要有通过HTTP认证的认证信息。另外若之前已经进行过1次请求，则表示用户认证失败。</p> <p>403：表示对请求资源的访问被服务器拒绝了。未获得文件系统的访问授权、访问权限等情况都可能是发生403的原因。</p> <p>404：表示服务器上无法找到请求的资源。除此之外，也可以在服务端拒绝请求且不想说明理由时使用。</p> <h3 id="_5xx-服务器错误"><a href="#_5xx-服务器错误" class="header-anchor">#</a> 5XX 服务器错误</h3> <p>500：表示服务器在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。</p> <p>503：表示服务器暂时处于超负载或正在进行停机维护，现在无法处理请求。</p> <p>504：代表网关超时。</p> <h3 id="get-和-post-的区别。"><a href="#get-和-post-的区别。" class="header-anchor">#</a> GET 和 POST 的区别。</h3> <ul><li>从<strong>缓存</strong>的角度，GET 请求会被浏览器主动缓存下来，留下历史记录，而 POST 默认不会。</li> <li>从<strong>编码</strong>的角度，GET 只能进行 URL 编码，只能接收 ASCII 字符，而 POST 没有限制。</li> <li>从<strong>参数</strong>的角度，GET 一般放在 URL 中，因此不安全，POST 放在请求体中，更适合传输敏感信息。</li> <li>从<strong>幂等性</strong>的角度，GET 是幂等的，而 POST 不是。(幂等表示执行相同的操作，结果也是相同的)</li> <li>从 <strong>TCP</strong> 的角度，GET 请求会把请求报文一次性发出去，而 POST 会分为两个 TCP 数据包，首先发 header 部分，如果服务器响应 100(continue)， 然后发 body 部分。(火狐浏览器除外，它的 POST 请求只发一个 TCP 包)</li></ul> <h2 id="http-1-0-1-1-2-0"><a href="#http-1-0-1-1-2-0" class="header-anchor">#</a> http 1.0 1.1 2.0</h2> <p><strong>HTTP 1.0</strong></p> <ul><li>最基础的HTTP协议；</li> <li>支持基本的GET、POST方法；</li></ul> <p><strong>HTTP 1.1</strong></p> <ul><li>缓存策略cache-control E-tag等；</li> <li>支持长连接Connection：keep-alive，一次TCP连接多次请求；</li> <li>断点续传，状态码206；</li> <li>支持新的方法PUT DELETE等，可用于Restful API；</li></ul> <p><strong>HTTP 2.0</strong></p> <ul><li>可压缩header，减少体积；</li> <li>多路复用，一次TCP连接中可以多个HTTP并行请求；</li> <li>服务端推送；</li></ul> <h2 id="http1-1-如何解决-http-的队头阻塞问题"><a href="#http1-1-如何解决-http-的队头阻塞问题" class="header-anchor">#</a> HTTP1.1 如何解决 HTTP 的队头阻塞问题？</h2> <h4 id="什么是-http-队头阻塞"><a href="#什么是-http-队头阻塞" class="header-anchor">#</a> 什么是 HTTP 队头阻塞？</h4> <p>从前面的小节可以知道，HTTP 传输是基于 <code>请求-应答</code>的模式进行的，报文必须是一发一收，但值得注意的是，里面的任务被放在一个任务队列中串行执行，一旦队首的请求处理太慢，就会阻塞后面请求的处理。这就是著名的 <code>HTTP队头阻塞</code>问题。</p> <h4 id="并发连接"><a href="#并发连接" class="header-anchor">#</a> 并发连接</h4> <p>对于一个域名允许分配多个长连接，那么相当于增加了任务队列，不至于一个队伍的任务阻塞其它所有任务。在RFC2616规定过客户端最多并发 2 个连接，不过事实上在现在的浏览器标准中，这个上限要多很多，Chrome 中是 6 个。</p> <p>但其实，即使是提高了并发连接，还是不能满足人们对性能的需求。</p> <h4 id="域名分片"><a href="#域名分片" class="header-anchor">#</a> 域名分片</h4> <p>一个域名不是可以并发 6 个长连接吗？那我就多分几个域名。</p> <p>比如 content1.sanyuan.com 、content2.sanyuan.com。</p> <p>这样一个 <code>sanyuan.com</code>域名下可以分出非常多的二级域名，而它们都指向同样的一台服务器，能够并发的长连接数更多了，事实上也更好地解决了队头阻塞的问题。</p> <h2 id="https"><a href="#https" class="header-anchor">#</a> HTTPS</h2> <p><img src="https://gitee.com/ekzodia_lty/blog-image/raw/master/img/20220219173255.png" alt=""></p> <ul><li>HTTPS协议需要到CA申请证书，一般免费证书很少，需要交费。</li> <li>HTTP协议运行在TCP之上，所有传输的内容都是明文，HTTPS运行在SSL/TLS之上，SSL/TLS运行在TCP之上，所有传输的内容都经过加密的。</li> <li>HTTP和HTTPS使用的是完全不同的连接方式，用的端口也不一样，前者是80，后者是443。</li> <li>HTTPS可以有效的防止运营商劫持，解决了防劫持的一个大问题。</li></ul> <h2 id="tls"><a href="#tls" class="header-anchor">#</a> TLS</h2> <p>SSL 即安全套接字层，它在 OSI 七层网络模型中处于第五层，SSL 在 1999 年被 <code>IETF(互联网工程组)</code>更名为 TLS ，即传输安全层，直到现在，TLS 一共出现过三个版本，1.1、1.2 和 1.3 ，目前最广泛使用的是 1.2。</p> <p>TLS 用于两个通信应用程序之间提供保密性和数据完整性。TLS 由<strong>记录协议、握手协议、警告协议、变更密码规范协议、扩展协议</strong>等几个子协议组成，综合使用了<strong>对称加密、非对称加密、身份认证</strong>等许多密码学前沿技术。</p> <p>TLS 是使用 <code>对称加密</code>和 <code>非对称加密</code> 的混合加密方式来实现机密性。</p></div></section> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">Last Updated: </span> <span class="time">3/27/2022, 10:11:17 PM</span></div></footer> <!----> <div class="comments-wrapper"><!----></div> <ul class="side-bar sub-sidebar-wrapper" style="width:12rem;" data-v-cb1513f6><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#osi七层模型" class="sidebar-link reco-side-osi七层模型" data-v-cb1513f6>OSI七层模型</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#tcp-ip模型" class="sidebar-link reco-side-tcp-ip模型" data-v-cb1513f6>TCP/IP模型</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#udp-与-tcp-的区别是什么" class="sidebar-link reco-side-udp-与-tcp-的区别是什么" data-v-cb1513f6>UDP 与 TCP 的区别是什么？</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#udp" class="sidebar-link reco-side-udp" data-v-cb1513f6>UDP</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#tcp" class="sidebar-link reco-side-tcp" data-v-cb1513f6>TCP</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#三次握手" class="sidebar-link reco-side-三次握手" data-v-cb1513f6>三次握手</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#四次挥手" class="sidebar-link reco-side-四次挥手" data-v-cb1513f6>四次挥手</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#http缓存" class="sidebar-link reco-side-http缓存" data-v-cb1513f6>http缓存</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#_1-什么是强缓存、协商缓存" class="sidebar-link reco-side-_1-什么是强缓存、协商缓存" data-v-cb1513f6>1.什么是强缓存、协商缓存</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#_2-缓存位置" class="sidebar-link reco-side-_2-缓存位置" data-v-cb1513f6>2.缓存位置</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#_3-cache-control有哪些字段" class="sidebar-link reco-side-_3-cache-control有哪些字段" data-v-cb1513f6>3.Cache-Control有哪些字段</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#http状态码" class="sidebar-link reco-side-http状态码" data-v-cb1513f6>http状态码</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#状态码的类别" class="sidebar-link reco-side-状态码的类别" data-v-cb1513f6>状态码的类别</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#_2xx-成功" class="sidebar-link reco-side-_2xx-成功" data-v-cb1513f6>2XX 成功</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#_3xx-重定向" class="sidebar-link reco-side-_3xx-重定向" data-v-cb1513f6>3XX 重定向</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#_4xx-客户端错误" class="sidebar-link reco-side-_4xx-客户端错误" data-v-cb1513f6>4XX 客户端错误</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#_5xx-服务器错误" class="sidebar-link reco-side-_5xx-服务器错误" data-v-cb1513f6>5XX 服务器错误</a></li><li class="level-3" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#get-和-post-的区别。" class="sidebar-link reco-side-get-和-post-的区别。" data-v-cb1513f6>GET 和 POST 的区别。</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#http-1-0-1-1-2-0" class="sidebar-link reco-side-http-1-0-1-1-2-0" data-v-cb1513f6>http 1.0 1.1 2.0</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#http1-1-如何解决-http-的队头阻塞问题" class="sidebar-link reco-side-http1-1-如何解决-http-的队头阻塞问题" data-v-cb1513f6>HTTP1.1 如何解决 HTTP 的队头阻塞问题？</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#https" class="sidebar-link reco-side-https" data-v-cb1513f6>HTTPS</a></li><li class="level-2" data-v-cb1513f6><a href="/blog/blogs/Summary/4.http.html#tls" class="sidebar-link reco-side-tls" data-v-cb1513f6>TLS</a></li></ul></main> <!----></div></div></div></div><div class="global-ui"><div class="back-to-ceiling" style="right:1rem;bottom:6rem;width:2.5rem;height:2.5rem;border-radius:.25rem;line-height:2.5rem;display:none;" data-v-c6073ba8 data-v-c6073ba8><svg t="1574745035067" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5404" class="icon" data-v-c6073ba8><path d="M526.60727968 10.90185116a27.675 27.675 0 0 0-29.21455937 0c-131.36607665 82.28402758-218.69155461 228.01873535-218.69155402 394.07834331a462.20625001 462.20625001 0 0 0 5.36959153 69.94390903c1.00431239 6.55289093-0.34802892 13.13561351-3.76865779 18.80351572-32.63518765 54.11355614-51.75690182 118.55860487-51.7569018 187.94566865a371.06718723 371.06718723 0 0 0 11.50484808 91.98906777c6.53300375 25.50556257 41.68394495 28.14064038 52.69160883 4.22606766 17.37162448-37.73630017 42.14135425-72.50938081 72.80769204-103.21549295 2.18761121 3.04276886 4.15646224 6.24463696 6.40373557 9.22774369a1871.4375 1871.4375 0 0 0 140.04691725 5.34970492 1866.36093723 1866.36093723 0 0 0 140.04691723-5.34970492c2.24727335-2.98310674 4.21612437-6.18497483 6.3937923-9.2178004 30.66633723 30.70611158 55.4360664 65.4791928 72.80769147 103.21549355 11.00766384 23.91457269 46.15860503 21.27949489 52.69160879-4.22606768a371.15156223 371.15156223 0 0 0 11.514792-91.99901164c0-69.36717486-19.13165746-133.82216804-51.75690182-187.92578088-3.42062944-5.66790279-4.76302748-12.26056868-3.76865837-18.80351632a462.20625001 462.20625001 0 0 0 5.36959269-69.943909c-0.00994388-166.08943902-87.32547796-311.81420293-218.6915546-394.09823051zM605.93803103 357.87693858a93.93749974 93.93749974 0 1 1-187.89594924 6.1e-7 93.93749974 93.93749974 0 0 1 187.89594924-6.1e-7z" p-id="5405" data-v-c6073ba8></path><path d="M429.50777625 765.63860547C429.50777625 803.39355007 466.44236686 1000.39046097 512.00932183 1000.39046097c45.56695499 0 82.4922232-197.00623328 82.5015456-234.7518555 0-37.75494459-36.9345906-68.35043303-82.4922232-68.34111062-45.57627738-0.00932239-82.52019037 30.59548842-82.51086798 68.34111062z" p-id="5406" data-v-c6073ba8></path></svg></div></div></div>
    <script src="/blog/assets/js/app.2c497286.js" defer></script><script src="/blog/assets/js/3.1e41fb2d.js" defer></script><script src="/blog/assets/js/1.a1bf8e1e.js" defer></script><script src="/blog/assets/js/34.30160844.js" defer></script>
  </body>
</html>
